<?php

declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

/**
 * 微信支付转账账单表
 * 
 * 用于存储微信支付转账账单信息
 */
final class WechatpayTransferBill extends AbstractMigration
{
    /**
     * Change Method.
     *
     * Write your reversible migrations using this method.
     *
     * More information on writing migrations is available here:
     * https://book.cakephp.org/phinx/0/en/migrations.html#the-change-method
     *
     * Remember to call "create()" or "update()" and NOT "save()" when working
     * with the Table class.
     */
    public function change(): void
    {
        $this->table('wechatpay_transfer_bill', ['comment' => '微信支付转账账单表'])
            ->addColumn('user_id', 'integer', ['signed' => false, 'comment' => '用户ID 用户表的主键id'])
            ->addColumn('mch_id', 'string', ['limit' => 32, 'comment' => '商户号 微信支付分配的商户号'])
            ->addColumn('out_bill_no', 'string', ['limit' => 32, 'comment' => '商户单号 商户系统内部的商家单号，要求此参数只能由数字、大小写字母组成，在商户系统内部唯一'])
            ->addColumn('transfer_bill_no', 'string', ['limit' => 64, 'null' => true, 'comment' => '商家转账订单号 商家转账订单的主键，唯一定义此资源的标识'])
            ->addColumn('appid', 'string', ['limit' => 32, 'comment' => '商户AppID 微信开放平台和微信公众平台为开发者的应用程序提供的唯一标识'])
            ->addColumn('state', 'enum', [
                'values' => ['APPLYING', 'ACCEPTED', 'PROCESSING', 'WAIT_USER_CONFIRM', 'TRANSFERING', 'SUCCESS', 'FAIL', 'CANCELING', 'CANCELLED'],
                'comment' => '单据状态 APPLYING:申请中;ACCEPTED:转账已受理;PROCESSING:转账锁定资金中;WAIT_USER_CONFIRM:待收款用户确认;TRANSFERING:转账中;SUCCESS:转账成功;FAIL:转账失败;CANCELING:转账撤销中;CANCELLED:转账撤销完成'
            ])
            ->addColumn('transfer_amount', 'integer', ['signed' => false, 'comment' => '转账金额 转账金额单位为"分"'])
            ->addColumn('fee', 'integer', ['signed' => false, 'comment' => '手续费 转账手续费，单位为"分"'])
            ->addColumn('transfer_remark', 'string', ['limit' => 32, 'comment' => '转账备注 单条转账备注（微信用户会收到该备注），UTF8编码，最多允许32个字符'])
            ->addColumn('fail_reason', 'string', ['limit' => 255, 'null' => true, 'comment' => '失败原因 订单已失败或者已退资金时，会返回订单失败原因'])
            ->addColumn('openid', 'string', ['limit' => 64, 'null' => true, 'comment' => '收款用户OpenID 用户在商户appid下的唯一标识'])
            ->addColumn('user_name', 'string', ['limit' => 20, 'null' => true, 'comment' => '收款用户姓名 收款方真实姓名'])
            ->addColumn('create_time', 'timestamp', ['comment' => '单据创建时间 单据受理成功时返回，按照使用rfc3339所定义的格式，格式为yyyy-MM-DDThh:mm:ss+TIMEZONE'])
            ->addColumn('update_time', 'timestamp', ['comment' => '最后一次状态变更时间 单据最后更新时间，按照使用rfc3339所定义的格式，格式为yyyy-MM-DDThh:mm:ss+TIMEZONE'])
            ->addIndex(['out_bill_no'], ['unique' => true, 'name' => 'uniq_out_bill_no'])
            ->create();
    }
}